package server;

//Fri Oct 15 18:07:43 EST 2004
//
//Written by Sean R. Owens, sean at guild dot net, released to the
//public domain.  Share and enjoy.  Since some people argue that it is
//impossible to release software to the public domain, you are also free
//to use this code under any version of the GPL, LPGL, or BSD licenses,
//or contact me for use of another license.
//http://darksleep.com/player

import java.net.Socket;
import java.net.ServerSocket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

public class SimpleHandler implements Runnable {
	private Socket sock = null;
	private InputStream sockInput = null;
	private OutputStream sockOutput = null;
	private Thread myThread = null;

	public SimpleHandler(Socket sock) throws IOException {
		this.sock = sock;
		sockInput = sock.getInputStream();
		sockOutput = sock.getOutputStream();
		this.myThread = new Thread(this);
		// Note that if we call myThread.start() now, we run the risk
		// of this new thread calling run before we're finished
		// constructing. We can't count on the fact that we call
		// .start() last - javac or the jvm might have reordered the
		// above lines. The class constructing us must wait for the
		// constructor to return and then call start() on us.
		System.out.println("SimpleHandler: New handler created.");
	}

	public void start() {
		myThread.start();
	}

	// All this method does is wait for some bytes from the
	// connection, read them, then write them back again, until the
	// socket is closed from the other side.
	public void run() {
		System.out.println("SimpleHandler: Handler run() starting.");
		while (true) {
			byte[] buf = new byte[1024];
			int bytes_read = 0;
			try {
				// This call to read() will wait forever, until the
				// program on the other side either sends some data,
				// or closes the socket.
				bytes_read = sockInput.read(buf, 0, buf.length);
				if (bytes_read < 0) {
					System.err
							.println("SimpleHandler: Tried to read from socket, read() returned < 0,  Closing socket.");
					break;
				}
				System.err.println("SimpleHandler: Received " + bytes_read
						+ " bytes, sending them back to client, data="
						+ (new String(buf, 0, bytes_read)));
				sockOutput.write(buf, 0, bytes_read);
				// This call to flush() is optional - we're saying go
				// ahead and send the data now instead of buffering
				// it.
				sockOutput.flush();
			} catch (Exception e) {
				e.printStackTrace(System.err);
				break;
			}
		}

		try {
			System.err.println("SimpleHandler:Closing socket.");
			sock.close();
		} catch (Exception e) {
			System.err
					.println("SimpleHandler: Exception while closing socket, e="
							+ e);
			e.printStackTrace(System.err);
		}

	}
}
